import request from '@/utils/request'

// 生成前端代码
export function generateCode(data) {
  return request({
    url: '/frontcode/generate',
    method: 'post',
    data: data,
    responseType: 'text', // 指定responseType为text，因为我们会在前端处理SSE数据流
    getResponse: true // 获取完整响应对象以访问流数据
  })
}

// 导出公共函数 - 处理SSE流数据
export function handleSseStream(response, onMessage, onError, onComplete) {
  if (!response.data) {
    onError("No response data");
    return;
  }
  
  // 获取响应体的Reader
  const reader = response.data.getReader();
  const decoder = new TextDecoder('utf-8');
  let buffer = '';
  
  // 处理流数据
  function processStreamData() {
    return reader.read().then(({ done, value }) => {
      if (done) {
        // 处理最后可能的未完成消息
        if (buffer.trim()) {
          try {
            const lastMessage = buffer.trim().replace(/^data:\s*/, '');
            if (lastMessage && lastMessage !== '[DONE]') {
              const data = JSON.parse(lastMessage);
              onMessage(data);
            }
          } catch (e) {
            console.error("Error parsing final message:", e);
          }
        }
        onComplete();
        return;
      }
      
      // 解码并累加到缓冲区
      buffer += decoder.decode(value, { stream: true });
      
      // 按行分割并处理每条消息
      const messages = buffer.split(/\n\n(?=data:)/);
      buffer = messages.pop() || '';
      
      // 处理每条完整的消息
      for (const msg of messages) {
        try {
          // 移除前缀"data:"并清理空白
          const cleanedData = msg.replace(/^data:\s*/, '').trim();
          
          if (cleanedData && cleanedData !== '[DONE]') {
            try {
              const data = JSON.parse(cleanedData);
              onMessage(data);
            } catch (parseError) {
              console.error('JSON解析错误:', parseError, '原始数据:', cleanedData);
            }
          }
        } catch (e) {
          console.error('数据处理错误:', e, '原始数据行:', msg);
          onError(e);
        }
      }
      
      // 继续读取
      return processStreamData();
    }).catch(error => {
      console.error("Stream reading error:", error);
      onError(error);
    });
  }
  
  // 开始处理流
  processStreamData();
} 